module Form.BaseForm;

const int FORMEVENT_QUIT	   =  -1;
const int FORMEVENT_SETCAPTION = 100;

//　テンプレートを使ってみたかっただけ！
private class FiFo(T){
	private T[] _buf;
	private T _def; //バッファに何も無い時に返す物
	private int _inptr , _outptr , _len;
	public this( int size , T def ){
		_buf = new T[size];
		_def = def;
		clear();
	} //

	public T outp(){
		if ( _len > 0 ) {
			T ret = _buf[ _outptr ];
			_outptr = ( _outptr + 1 ) % _buf.length;
			_len--;
			return ret;
		}
		return _def;
	} //

	public bool inp( T data ){
		if ( _len + 1 < _buf.length ) {
			_buf[ _inptr ] = data;
			_inptr = ( _inptr + 1 ) % _buf.length;
			_len++;
			return true;
		}
		return false;
	} //
	
	public void clear(){
		for ( int i = 0 , len = _buf.length ; i < len ; i++ ) _buf[ i ] = _def;
		_inptr  = 0;
		_outptr = 0;
		_len    = 0;
	} //

} //


private class Box(T){
	private T _v;
	public this( T value ){
		T = value;
	} //
	public T value(){
		return _v;
	} //
	public void value( T value ){
		_v = value;
	} //
} //




public class BaseForm{
	private int _eptr = 0;
	private char[] _caption;
	private FiFo!(int) _events;
	protected bool _quitFlag = false;


	public this(){
		_events = new FiFo!(int)( 1024 , 0 );
	} //
	public this( char[] c ){
		_caption = c;
	} //
	
	public bool init(){
		return true;
	} //

	public bool close(){
		return true;
	} //
	
	public bool onExit(){
		return true;
	} //

	public int pollEvent(){
		return _events.outp;
	} //
	
	protected bool setEvent(int e){
		return ( _events.inp = e );
	} //
	
	protected bool setQuit(){
		_quitFlag = true;
		if (setEvent( FORMEVENT_QUIT ) ) return true;
		_events.clear();
		return setEvent( FORMEVENT_QUIT );
	} //

	public void caption( char[] c ){
		_caption = c;
		setEvent( FORMEVENT_SETCAPTION );
	} //
	public char[] caption(){
		return _caption;
	} //


	public bool onTimer(){
		action();
		draw();
		return true;
	} //
	
	
	public bool action(){
		return true;
	} //
	
	public bool draw(){
		return true;
	} //
	
	public bool onMouseMove( int x , int y , int button){
		return true;
	} //

	public bool onMouseDown( int x , int y , int button){
		return true;
	} //

	public bool onMouseUp( int x , int y , int button){
		return true;
	} //
	
	public bool onMouseEnter( int x , int y ){
		return true;
	} //
	
	public bool onMouseLeave(){
		return true;
	} //
	
	public bool onGetFocus(){
		return true;
	} //
	
	public bool onLostFocus(){
		return true;
	} //

	public bool onMouseWheel( int x , int y , int deltaY , int deltaX = 0 ){
		return true;
	} //
	
	public bool onKeyDown( int KeyCode ){
		return true;
	} //

	public bool onKeyUp( int KeyCode ){
		return true;
	} //
	
	public bool onJoyAxis( int id , int axis , int delta ){
		return true;
	} //
	
	public bool onJoyButtonDown( int id , int button ){
		return true;
	} //

	public bool onJoyButtonUp( int id , int button ){
		return true;
	} //

} //


